package middlewares

import (
	"backend/app/model"
	"backend/app/web/api"
	"backend/utils/format"
	"strings"

	"github.com/gin-gonic/gin"
)

// JWTUserAuthMiddleware 基于JWT的认证中间件
func JWTUserAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// Authorization: Bearer xxxxxxx.xxx.xxx  / X-TOKEN: xxx.xxx.xx
		authHeader := c.Request.Header.Get("Authorization")
		//authHeader := c.Request.URL.RawQuery
		if authHeader == "" {
			format.NewResponseJson(c).Error(format.CodeNeedLogin)
			c.Abort()
			return
		}
		// 按空格分割
		parts := strings.SplitN(authHeader, "&", -1)
		hasToken := false
		tokenStr := ""
		for _, value := range parts {
			items := strings.SplitN(value, " ", 2)
			if len(items) == 2 && items[0] == "Bearer" {
				hasToken = true
				tokenStr = items[1]
			}
		}
		if !hasToken {
			format.NewResponseJson(c).Error(format.CodeInvalidToken)
			c.Abort()
			return
		}
		userID, isok, _, err := api.UserCheckToken(tokenStr)
		if err != nil || !isok {
			format.NewResponseJson(c).Error(format.CodeInvalidToken)
			c.Abort()
			return
		}
		// 将当前请求的userID信息保存到请求的上下文c上
		c.Set(model.CtxUserIDKey, userID)
		c.Next()
		// 后续的处理请求的函数中 可以用过c.Get(CtxUserIDKey) 来获取当前请求的用户信息
	}
}
